/**
 * 函数行为控制工具类
 * 提供函数执行策略封装，如：仅执行一次、防抖、节流等
 */
export class FunctionControlUtils {
    /**
     * 创建一个只执行一次的函数包装器
     * 第一次调用时执行原函数并缓存结果，后续调用直接返回缓存结果
     *
     * @template T - 原函数类型
     * @param {T} fn - 需要被包装的原始函数
     * @returns {T} 包装后的函数，行为与原函数一致，但只执行一次
     *
     * @example
     * const init = FunctionControl.once(async () => {
     *   await createUploadDir();
     *   console.log('✅ 初始化完成');
     * });
     *
     * await init(); // 执行初始化
     * await init(); // 不再执行，直接返回上次结果
     */
    static once<T extends (...args: any[]) => any>(fn: T): T {
        let called = false;
        let result: any;

        return function (this: any, ...args: any[]): any {
            if (!called) {
                called = true;
                result = fn.apply(this, args);
            }
            return result;
        } as T;
    }
}
